Перестановкой порядка n называется
последовательность из попарно различных целых положительных чисел p1, p2,
..., pn, где каждое 1 ≤ pi ≤
n. Будем говорить, что перестановка q1, q2, ..., qn лексикографически меньше перестановки p1, p2,
..., pn, если существует такое i, что qi < pi, а для любого j < i pj = qj.
Циклическим сдвигом на k перестановки
p1, p2, ...,
pn называется последовательность pk+1, pk+2, ..., pn, p1, ..., pk. Отметим, что любой циклический
сдвиг перестановки также является перестановкой.
Найдите наименьший
лексикографически циклический сдвиг заданной перестановки.
Вход. Первая строка содержит порядок n
(1 ≤ n ≤ 105) заданной перестановки. Вторая строка
содержит числа p1, p2, ..., pn.
Выход. Выведите перестановку, являющуюся
наименьшим лексикографически циклическим сдвигом перестановки, заданной на
входе. Используйте такой же формат, в каком перестановка задана во второй
строке входных данных.
Пример
входа |
Пример
выхода |
3 3 2 1 |
3 3 2 1 |
массив
Входная
перестановка содержит числа от 1 до n в некотором порядке. Лексически наименьшим цмклическим
сдвигом будет перестановка, которая начинается с 1. Пусть i – позиция 1 в
исходной перестановке. Тогда выводим:
·
элементы перестановки с позиции i до конца;
·
элементы перестановки с начала до позиции i – 1;
Входную перестановку храним в массиве p.
int p[100000];
Читаем входные данные.
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &p[i]);
Ищем позицию i, в которой находится 1.
for (i = 0; i < n; i++)
if (p[i] == 1)
{
Выводим числа с позиции i до конца
перестановки.
for (j = i; j < n;
j++)
printf("%d ", p[j]);
Выводим числа с начала перестановки до позиции i – 1.
for (j =
0; j < i; j++)
printf("%d ", p[j]);
return 0;
}